package pe.edu.upc.dew.egretel.controller;

import java.io.IOException;
import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.Date;
import javax.servlet.ServletConfig;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import org.springframework.context.ApplicationContext;
import org.springframework.web.context.support.WebApplicationContextUtils;
import pe.edu.upc.dew.egretel.model.Persona;
import pe.edu.upc.dew.egretel.model.Reclamo;
import pe.edu.upc.dew.egretel.service.PersonaService;
import pe.edu.upc.dew.egretel.service.ReclamoService;
import pe.edu.upc.dew.egretel.service.ReclamoServiceImpl;

/**
 *
 * @author Luis Tantaruna
 */
public class IngresoServlet extends HttpServlet {

    private PersonaService xPersonaService;
    private ReclamoService xReclamoService;

    @Override
    public void init(ServletConfig config) throws ServletException {

        ApplicationContext context = WebApplicationContextUtils.getWebApplicationContext(config.getServletContext());
        this.xPersonaService = (PersonaService) context.getBean("personaService");
        this.xReclamoService = (ReclamoService) context.getBean("reclamoService");
    }

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {

        // Session
        HttpSession vSesion = req.getSession();

        // obtengo el parametro accion
        String accion = req.getParameter("accion");

        // si el post se invoca desde la creacion del ticket
        if (accion.equals("insertReclamo") == true) {
            insertReclamo(req);
        }
        if (accion.equals("updateEstado") == true) {
            updateEstado(req);
        }

        String username = req.getParameter("username");
        String password = req.getParameter("password");

        Persona usuario = xPersonaService.logeo(username, password);

        if (usuario == null) {
            req.setAttribute("Ingreso", "Usuario no existe");
            req.getRequestDispatcher("failure.jsp").forward(req, resp);
            return;
        }

        vSesion.setAttribute("persona", usuario);

        if (usuario != null) {
            if (usuario.getIdTipoPersona().equals("C")) {
                req.getRequestDispatcher("BandejaCliente.jsp").forward(req, resp);
            }
            if (usuario.getIdTipoPersona().equals("E")) {
                req.getRequestDispatcher("BandejaEspecialista.jsp").forward(req, resp);
            } //else {
                //req.getRequestDispatcher("failure.jsp").forward(req, resp);
            //}
        }
    }

    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {

        req.getRequestDispatcher("logeo_usuario.jsp").forward(req, resp);
    }

    private void insertReclamo(HttpServletRequest req) {

        // obtengo la sesion
        HttpSession session = req.getSession();

        StringBuilder builder = new StringBuilder();

        // se inicializa como PENDIENTE
        String idEstado = "P";
        String idEspecialista = null;
        idEspecialista = "1";

        Persona cliente = (Persona) session.getAttribute("usuario");

        String idCliente = "4"; // Por default siempre es Roberto (uno que aumente)
        if (cliente != null) {
            idCliente = String.valueOf(cliente.getIdPersona());
        }

        //(IdCliente, descripcion, telefono, IdCategoria, IdEspecialista, fechaCreacion, estado)

        builder = builder.append(idCliente).append(", ");
        builder = builder.append("'").append(req.getParameter("txtdescrip")).append("', ");
        builder = builder.append(req.getParameter("txtTelefono")).append(", ");
        builder = builder.append(req.getParameter("listCategoria")).append(", ");
        builder = builder.append(idEspecialista).append(", ");
        builder = builder.append("'").append(getDateTime()).append("', ");
        builder = builder.append(idEstado).append(", ");

        this.xReclamoService.insertaReclamo(builder.toString());
    }

    private void updateEstado(HttpServletRequest req) {
        // obtengo la sesion
        HttpSession session = req.getSession();

        //StringBuilder builder = new StringBuilder();

        // obtengo el id del usuario
        Persona persona = (Persona) session.getAttribute("usuario");

        // obtenemos el reclamo
        Reclamo reclamo = (Reclamo) session.getAttribute("reclamo");

        if (persona.getIdTipoPersona().equals("E")) {

            ReclamoService service = new ReclamoServiceImpl();

            if (reclamo.getIdEstado().equals("Pendiente")) {
                service.actualizaEstadoReclamo(String.valueOf(reclamo.getIdReclamo()), "P", req.getParameter("txtSolucion"));
            } else if (reclamo.getIdEstado().equals("En Proceso")) {
                service.actualizaEstadoReclamo(String.valueOf(reclamo.getIdReclamo()), "R", req.getParameter("txtSolucion"));
            } else if (reclamo.getIdEstado().equals("Atendido")) {
                service.actualizaEstadoReclamo(String.valueOf(reclamo.getIdReclamo()), "A", req.getParameter("txtSolucion"));
            }
        }
    }

    private String getDateTime() {
        DateFormat dateFormat = new SimpleDateFormat("dd/MM/yyyy HH:mm:ss");
        Date date = new Date();
        return dateFormat.format(date);
    }
}
